home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 351-375 / disk_356 / algorhythms / source / gadgets.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  18KB  |  634 lines

  1. /* gadgets.c */
  2. /* Copyright 1990 Thomas E. Janzen All Rights Reserved */
  3. /*
  4. **  FACILITY:
  5. **
  6. **    AlgoRhythms music improviser on Commodore (TM) Amiga (TM)
  7. **    compiled with Lattice (TM) C 5.05
  8. **
  9. **  ABSTRACT:
  10. **
  11. **    Algorhythms improvises music over the MIDI serial port.
  12. **
  13. **  AUTHORS: Thomas E. Janzen
  14. **
  15. **  CREATION DATE:    26-MAR-1990
  16. **
  17. **  MODIFICATION HISTORY:
  18. **    DATE    NAME    DESCRIPTION
  19. **--
  20. */
  21. #include <stdlib.h>
  22. #include <ctype.h>
  23. #include <stdio.h>
  24. #include <math.h>
  25. #include <string.h>
  26. #include <intuition/intuition.h>
  27. #include <graphics/text.h>
  28. #include <proto/dos.h>
  29. #include <proto/graphics.h>
  30. #include <proto/exec.h>
  31. #include <proto/mathffp.h>
  32. #include <proto/intuition.h>
  33.  
  34. #define STRINGSIZE 80
  35.  
  36. /*WINDOW*/
  37. extern struct Window *w;
  38.  
  39. /* GADGET */
  40. #define GADGETTEXTDOWN (12)
  41. #define CLEFT (10)
  42. #define CTOP (6)
  43. #define GADGETWIDTH (300)
  44. #define GADGETHEIGHT (24)
  45. #define LEFTEDGE (-1)
  46. #define TOPEDGE (-1)
  47. #define REQUESTERTEXTDOWN (34)
  48. #define REQUESTERWIDTH (350)
  49. #define REQUESTERHEIGHT (47)
  50. /*for last routine*/
  51. #define GADGETWIDE 230
  52. #define GADGETHIGH 10
  53. #define TOP 1
  54. #define LEFT 100
  55.  
  56. extern struct GfxBase *GfxBase;
  57. extern struct IntuitionBase *IntuitionBase;
  58. extern struct DOSBase *DOSBase;
  59. extern struct MathBase *MathBase;
  60.  
  61. char *MIDItoPitchName(int NoteNum, char *PitchName);
  62. int PitchNametoMIDI(char *PitchName);
  63.  
  64. char *GetGadgetInput(
  65.     char Previous[],
  66.     char RemindString[], 
  67.     char PromptString[]) {
  68.     register int classb;
  69.     static char GadgetString[32];
  70.     static struct IntuiText GadgetTxt=
  71.         {1,2,JAM2,10,GADGETTEXTDOWN,NULL,NULL,NULL};
  72.     static struct StringInfo 
  73.         StringStuff={NULL,NULL,0,STRINGSIZE,0,0,0,0,
  74.         CLEFT,CTOP,NULL,0,NULL};
  75.     SHORT GadgetPairs[]=
  76.         {0,0,GADGETWIDTH,0,GADGETWIDTH,GADGETHEIGHT,0,
  77.         GADGETHEIGHT,0,0};
  78.     struct Border GadgetBorder=
  79.     {LEFTEDGE,TOPEDGE,1,2,JAM1,5,NULL,NULL};
  80.     static struct Gadget StringBox = {
  81.         NULL,2,6,GADGETWIDTH,GADGETHEIGHT,
  82.         GADGHCOMP,RELVERIFY|STRINGCENTER,
  83.         STRGADGET|REQGADGET,
  84.         NULL,NULL,NULL,0L,NULL,1,NULL};
  85.  
  86.     /*REQUESTER*/
  87.     static UBYTE RequestString[32];
  88.     static struct IntuiText RequestTxt={1,2,JAM2,10,REQUESTERTEXTDOWN,
  89.     NULL,RequestString,NULL};
  90.     static SHORT RequesterPairs[]={0,0,REQUESTERWIDTH-1,0,
  91.     REQUESTERWIDTH-1,REQUESTERHEIGHT-1,0,REQUESTERHEIGHT-1,0,0};
  92.     static struct Border RequesterBorder={0,0,1,0,JAM1,5,NULL,NULL};
  93.  
  94.     struct Requester AnswerRequest;
  95.     struct IntuiMessage *message;
  96.  
  97.     BOOL Waiton=TRUE;
  98.     
  99.     InitRequester(&AnswerRequest);
  100.     strcpy(RequestString,RemindString);
  101.     strcpy(GadgetString,PromptString);
  102.  
  103.     AnswerRequest.OlderRequest=NULL;
  104.     AnswerRequest.LeftEdge=10; /*position*/
  105.     AnswerRequest.TopEdge=30;
  106.     AnswerRequest.Width=REQUESTERWIDTH;
  107.     AnswerRequest.Height=REQUESTERHEIGHT;
  108.     AnswerRequest.RelLeft=0;
  109.     AnswerRequest.RelTop=0;
  110.     AnswerRequest.ReqGadget=&StringBox;
  111.     AnswerRequest.ReqBorder=&RequesterBorder;
  112.     AnswerRequest.ReqText=&RequestTxt;
  113.     AnswerRequest.Flags=0;
  114.     AnswerRequest.BackFill=3;
  115.     AnswerRequest.ReqLayer=NULL;
  116.     AnswerRequest.ImageBMap=NULL;
  117.     AnswerRequest.RWindow = w;
  118.  
  119.     GadgetTxt.IText=GadgetString;
  120.     GadgetBorder.XY=GadgetPairs;
  121.     StringStuff.Buffer=Previous;
  122.     StringStuff.UndoBuffer=Previous;
  123.     StringBox.GadgetRender=(APTR)&GadgetBorder;
  124.     StringBox.GadgetText=&GadgetTxt;
  125.     StringBox.SpecialInfo=(APTR)&StringStuff;
  126.     RequesterBorder.XY=RequesterPairs;
  127.  
  128.     Request(&AnswerRequest,w);
  129.     OnGadget(&StringBox,w,&AnswerRequest);
  130.     RefreshGadgets(&StringBox,w,&AnswerRequest);
  131.     
  132.     while (Waiton) {
  133.         if(w->UserPort->mp_SigBit) {
  134.             message=(struct IntuiMessage *)GetMsg(w->UserPort);
  135.             if(message != NULL) {
  136.                 classb=message->Class;
  137.                 ReplyMsg((struct Message *)message);
  138.                 switch (classb) {
  139.                     case GADGETUP:
  140.                     EndRequest(&AnswerRequest,w);
  141.                     Waiton=FALSE;
  142.                     break;
  143.                 }
  144.             }
  145.         }
  146.     }
  147.     return Previous;
  148. }
  149.  
  150. const char OKString[4]="OK";
  151. const struct IntuiText OKTxt={1,2,JAM2,14,1,NULL,OKString,NULL};
  152. const static SHORT OKPairs[]={0,0,41,0,41,12,0,12,0,0};
  153. struct Border OKBorder={-1,-1,1,0,JAM1,5,OKPairs,NULL};
  154. struct Gadget OKGadget = {
  155.     NULL, /* next gadget */
  156.     250,30,41,12, /*left , top, wide, high*/
  157.     GADGHCOMP,RELVERIFY|ENDGADGET,
  158.     BOOLGADGET|REQGADGET,
  159.     (APTR)&OKBorder,NULL,&OKTxt,0L,NULL,2,NULL};
  160.  
  161. struct PropInfo SliderInfo={ /*Flags*/AUTOKNOB|FREEHORIZ, 
  162.     0x8000 /*HorizPot %*/,0x8000 /*VertPot*/,
  163.     /*HorizBody*/ 0x100 ,/* VertBody*/ 0x0,
  164.     0 /*CWidth*/,0 /*CHeight*/,0 /*HpotRes*/,0 /*VPotRes*/,
  165.     0 /*LeftBorder*/,0 /*TopBorder*/
  166.     };
  167.     
  168. const SHORT SliderPairs[]={0,0,GADGETWIDTH,0,GADGETWIDTH,GADGETHEIGHT,0,
  169.     GADGETHEIGHT,0,0};
  170. const struct Border SliderBorder=
  171.     {LEFTEDGE,TOPEDGE,1,2,JAM1,5,SliderPairs,NULL};
  172. struct Gadget SliderGadget = {
  173.     &OKGadget,
  174.     23,20,GADGETWIDTH,8, /* left,top,wide,high*/
  175.     GADGHCOMP,RELVERIFY|GADGIMMEDIATE,
  176.     PROPGADGET|REQGADGET,
  177.     (APTR)&SliderBorder,NULL,NULL,0L,
  178.     (APTR)&SliderInfo,1,NULL};
  179.  
  180. /*REQUESTER*/
  181. struct IntuiText RemindTxt={1,2,JAM2,5,30,NULL,NULL,NULL};
  182. const UBYTE TitleString[32]="Phase in Radians";
  183. const struct IntuiText TitleTxt={1,2,JAM2,
  184.     10 /*left */,1 /*top*/,NULL,TitleString,&RemindTxt};
  185. const char PhaseString[]="-pi   -pi/2       0      pi/2      pi";
  186. struct IntuiText PhaseTxt={1,2,JAM2,25,11 /*text down*/,NULL,
  187.     PhaseString,&TitleTxt};
  188. SHORT RequesterPairs[]={0,0,REQUESTERWIDTH-1,0,
  189.     REQUESTERWIDTH-1,REQUESTERHEIGHT-1,0,REQUESTERHEIGHT-1,0,0};
  190. struct Border RequesterBorder={0,0,1,0,JAM1,5,NULL,NULL};    
  191.  
  192. double GetPhaseInput(double Previous, char TypeString[]) {
  193.     struct IntuiMessage *message;
  194.     double Answer;
  195.     USHORT GadgetNum;
  196.     struct Gadget *TempPtr;
  197.     register int classb;
  198.     struct Requester PhaseRequest;
  199.     BOOL Waiton=TRUE;
  200.     InitRequester(&PhaseRequest);
  201.     PhaseRequest.OlderRequest=NULL;
  202.     PhaseRequest.LeftEdge=10; /*position*/
  203.     PhaseRequest.TopEdge=30;
  204.     PhaseRequest.Width=REQUESTERWIDTH;
  205.     PhaseRequest.Height=REQUESTERHEIGHT;
  206.     PhaseRequest.RelLeft=0;
  207.     PhaseRequest.RelTop=0;
  208.     PhaseRequest.ReqGadget=&SliderGadget;
  209.     PhaseRequest.ReqBorder=&RequesterBorder;
  210.     PhaseRequest.ReqText=&PhaseTxt;
  211.     PhaseRequest.Flags=0;
  212.     PhaseRequest.BackFill=3;
  213.     PhaseRequest.ReqLayer=NULL;
  214.     PhaseRequest.ImageBMap=NULL;
  215.     PhaseRequest.RWindow = w;
  216.     RequesterBorder.XY=RequesterPairs;
  217.     RemindTxt.IText=TypeString;
  218.     
  219.     if (fabs(Previous) > 3.141593) {
  220.     Previous=(Previous/(fabs(Previous)))*(fabs(Previous)-3.141593);
  221.     }
  222.     SliderInfo.HorizPot=
  223.         (short)(int)((double)10430*Previous+(double)0x8000);
  224.     
  225.     Request(&PhaseRequest,w);
  226.     OnGadget(&SliderGadget,w,&PhaseRequest);
  227.     RefreshGadgets(&SliderGadget,w,&PhaseRequest);
  228.     
  229.     while (Waiton) {
  230.         if(w->UserPort->mp_SigBit) {
  231.             message=(struct IntuiMessage *)GetMsg(w->UserPort);
  232.             if(message != NULL) {
  233.                 classb=message->Class;
  234.                 TempPtr=(struct Gadget *)message->IAddress;
  235.                 ReplyMsg((struct Message *)message);
  236.                 if (classb == GADGETUP) {
  237.                     GadgetNum=TempPtr->GadgetID;
  238.                 }
  239.                 if (GadgetNum == 2) {
  240.                     switch (classb) {
  241.                         case GADGETUP:
  242.                         EndRequest(&PhaseRequest,w);
  243.                         Waiton=FALSE;
  244.                         Answer=
  245.         ((95.9E-6)*(double)(SliderInfo.HorizPot))-3.141593;
  246.                         break;
  247.                     }
  248.                 }
  249.             }
  250.         }
  251.     }
  252.     return Answer;
  253. }
  254.  
  255. int GetStringInput(char Previous[],
  256.     char RemindString[], 
  257.     char PromptString[]) {
  258.     int failure=0;
  259.     USHORT GadgetNum;
  260.     struct Gadget *TempPtr;
  261.     
  262.     char OKString[4]="OK";
  263.     struct IntuiText OKTxt={1,2,JAM2,14,1,NULL,NULL,NULL};
  264.     static SHORT OKPairs[]={0,0,41,0,41,12,0,12,0,0};
  265.     struct Border OKBorder={-1,-1,1,0,JAM1,5,NULL,NULL};
  266.     struct Gadget OKGadget = {
  267.     NULL, /* next gadget */
  268.     250,32,41,12, /*left , top, wide, high*/
  269.     GADGHCOMP,RELVERIFY|ENDGADGET,
  270.     BOOLGADGET|REQGADGET,
  271.     NULL,NULL,NULL,0L,NULL,1,NULL};
  272.  
  273.     char QuitString[8]="Quit";
  274.     struct IntuiText QuitTxt={1,2,JAM2,4,1,NULL,NULL,NULL};
  275.     struct Gadget QuitGadget = {
  276.     NULL, /* next gadget */
  277.     190,32,41,12, /*left , top, wide, high*/
  278.     GADGHCOMP,RELVERIFY|ENDGADGET,
  279.     BOOLGADGET|REQGADGET,
  280.     NULL,NULL,NULL,0L,NULL,2,NULL};
  281.     
  282.     register int classb;
  283.     static char GadgetString[32];
  284.     static struct IntuiText GadgetTxt=
  285.         {1,2,JAM2,10,GADGETTEXTDOWN,NULL,NULL,NULL};
  286.     static struct StringInfo 
  287.         StringStuff={NULL,NULL,0,STRINGSIZE,0,0,0,0,
  288.         CLEFT,CTOP,NULL,0,NULL};
  289.     static SHORT GadgetPairs[]=
  290.         {0,0,GADGETWIDTH,0,GADGETWIDTH,GADGETHEIGHT,0,
  291.         GADGETHEIGHT,0,0};
  292.     static struct Border GadgetBorder=
  293.     {LEFTEDGE,TOPEDGE,1,2,JAM1,5,NULL,NULL};
  294.     static struct Gadget StringBox = {
  295.         NULL,2,6,GADGETWIDTH,GADGETHEIGHT,
  296.         GADGHCOMP,RELVERIFY|STRINGCENTER,
  297.         STRGADGET|REQGADGET,
  298.         NULL,NULL,NULL,0L,NULL,1,NULL};
  299.  
  300.     /*REQUESTER*/
  301.     static UBYTE RequestString[32];
  302.     static struct IntuiText RequestTxt={1,2,JAM2,10,REQUESTERTEXTDOWN,
  303.     NULL,RequestString,NULL};
  304.     static SHORT RequesterPairs[]={0,0,REQUESTERWIDTH-1,0,
  305.     REQUESTERWIDTH-1,REQUESTERHEIGHT-1+25,0,REQUESTERHEIGHT-1+25,0,0};
  306.     static struct Border RequesterBorder={0,0,1,0,JAM1,5,NULL,NULL};
  307.  
  308.     struct Requester AnswerRequest;
  309.     struct IntuiMessage *message;
  310.  
  311.     BOOL Waiton=TRUE;
  312.     InitRequester(&AnswerRequest);
  313.     OKGadget.NextGadget=&QuitGadget;
  314.     OKBorder.XY=OKPairs;
  315.     OKGadget.GadgetRender=(APTR)&OKBorder;
  316.     OKGadget.GadgetText=&OKTxt;
  317.     QuitGadget.GadgetRender=(APTR)&OKBorder;
  318.     QuitTxt.IText=QuitString;
  319.     QuitGadget.GadgetText=&QuitTxt;
  320.     OKTxt.IText=OKString;
  321.     StringBox.NextGadget=&OKGadget;
  322.  
  323.     strcpy(RequestString,RemindString);
  324.     strcpy(GadgetString,PromptString);
  325.  
  326.     AnswerRequest.OlderRequest=NULL;
  327.     AnswerRequest.LeftEdge=10; /*position*/
  328.     AnswerRequest.TopEdge=30;
  329.     AnswerRequest.Width=REQUESTERWIDTH;
  330.     AnswerRequest.Height=REQUESTERHEIGHT;
  331.     AnswerRequest.RelLeft=0;
  332.     AnswerRequest.RelTop=0;
  333.     AnswerRequest.ReqGadget=&StringBox;
  334.     AnswerRequest.ReqBorder=&RequesterBorder;
  335.     AnswerRequest.ReqText=&RequestTxt;
  336.     AnswerRequest.Flags=0;
  337.     AnswerRequest.BackFill=3;
  338.     AnswerRequest.ReqLayer=NULL;
  339.     AnswerRequest.ImageBMap=NULL;
  340.     AnswerRequest.RWindow = w;
  341.  
  342.     GadgetTxt.IText=GadgetString;
  343.     GadgetBorder.XY=GadgetPairs;
  344.     StringStuff.Buffer=Previous;
  345.     StringStuff.UndoBuffer=Previous;
  346.     StringBox.GadgetRender=(APTR)&GadgetBorder;
  347.     StringBox.GadgetText=&GadgetTxt;
  348.     StringBox.SpecialInfo=(APTR)&StringStuff;
  349.     RequesterBorder.XY=RequesterPairs;
  350.  
  351.     Request(&AnswerRequest,w);
  352.     OnGadget(&StringBox,w,&AnswerRequest);
  353.     RefreshGadgets(&StringBox,w,&AnswerRequest);
  354.     
  355.     while (Waiton) {
  356.         if(w->UserPort->mp_SigBit) {
  357.             message=(struct IntuiMessage *)GetMsg(w->UserPort);
  358.             if(message != NULL) {
  359.                 classb=message->Class;
  360.                 TempPtr=(struct Gadget *)message->IAddress;
  361.                 ReplyMsg((struct Message *)message);
  362.                 if(classb == GADGETUP) {
  363.                     GadgetNum=TempPtr->GadgetID;
  364.                     switch(GadgetNum) {
  365.                         case 0: /*got string*/
  366.                             failure=0;
  367.                             break;
  368.                         case 1: /*string OK*/
  369.                             failure=0;
  370.                             break;
  371.                         case 2: /*quit*/
  372.                             failure=1;
  373.                             break;
  374.                     }
  375.                     EndRequest(&AnswerRequest,w);
  376.                     Waiton=FALSE;
  377.                     break;
  378.                 }
  379.             }
  380.         }
  381.     }
  382.     return failure;
  383. }
  384.  
  385. #include "AlgoRhythms.h"
  386.  
  387. int GetChannelStuff(struct NoteEvent *Event, int Number) {
  388. /* TempWalking is int */
  389. /* ->Walking is int*/
  390. /* Gadget.Flags is USHORT*/
  391.     int TempHigh,TempLow,TempChannel,TempWalking;
  392.     char OKString[4]="OK"; /*        L  T      txt  next*/
  393.     struct IntuiText OKTxt={1,2,JAM2,24,1,NULL,NULL,NULL};
  394.     static SHORT OKPairs[]={0,0,61,0,61,12,0,12,0,0};
  395.         /*                               XY */
  396.     struct Border OKBorder={-1,-1,1,0,JAM1,5,NULL,NULL};
  397.     struct Gadget OKGadget = {NULL, /* next gadget */
  398.     185,67,61,12, /*left , top, wide, high*/
  399.     GADGHCOMP,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET,
  400.     NULL,NULL,NULL,0L,NULL,1,NULL};
  401.  
  402.     char CancelString[8]="Cancel";
  403.     struct IntuiText CancelTxt={1,2,JAM2,4,1,NULL,NULL,NULL};
  404.     struct Gadget CancelGadget = {NULL, /* next gadget */
  405.     5,67,61,12, /*left , top, wide, high*/
  406.     GADGHCOMP,RELVERIFY|ENDGADGET,BOOLGADGET|REQGADGET,
  407.     NULL,NULL,NULL,0L,NULL,2,NULL};
  408.  
  409.     static UBYTE HighString[16]="High Note";
  410.     static struct IntuiText HighTxt={1,2,JAM2,1,-8,NULL,NULL,NULL};
  411.     static char HighBuff[80];
  412.     static struct StringInfo HighInfo={NULL,NULL,0,STRINGSIZE,0,0,0,0,
  413.         LEFT,TOP,NULL,0,NULL};
  414.     static USHORT HighPairs[10]={0,0,GADGETWIDE,0,
  415.         GADGETWIDE,8,0,8,0,0};
  416.     static struct Border HighBorder=
  417.         {LEFTEDGE,TOPEDGE,1,2,JAM1,5,NULL,NULL};
  418.     static struct Gadget HighGadg = {NULL,2,8,GADGETWIDE,GADGETHIGH,
  419.         GADGHCOMP,RELVERIFY|STRINGCENTER,STRGADGET|REQGADGET,
  420.         NULL,NULL,NULL,0L,NULL,3,NULL};
  421.     
  422.     static UBYTE LowString[16]="Low Note";
  423.     static struct IntuiText LowTxt={1,2,JAM2,1,-8,NULL,NULL,NULL};
  424.     static char LowBuff[80];
  425.     static struct StringInfo LowInfo={NULL,NULL,0,STRINGSIZE,0,0,0,0,
  426.         LEFT,TOP,NULL,0,NULL};
  427.     static struct Gadget LowGadg = {NULL,2,24,GADGETWIDE,GADGETHIGH,
  428.         GADGHCOMP,RELVERIFY|STRINGCENTER,STRGADGET|REQGADGET,
  429.         NULL,NULL,NULL,0L,NULL,4,NULL};
  430.  
  431.     static UBYTE ChannelString[16]="Channel";
  432.     static struct IntuiText ChannelTxt=
  433.         {1,2,JAM2,1,-8,NULL,NULL,NULL};
  434.     static char ChannelBuff[80];
  435.     static struct StringInfo 
  436.         ChannelInfo={NULL,NULL,0,STRINGSIZE,0,0,0,0,
  437.         LEFT,TOP,NULL,0,NULL};
  438.     static struct Gadget ChannelGadg = {NULL,2,40,GADGETWIDE,GADGETHIGH,
  439.         GADGHCOMP,RELVERIFY|STRINGCENTER,
  440.         LONGINT|STRGADGET|REQGADGET,NULL,NULL,NULL,0L,NULL,5,NULL};
  441.  
  442.     static UBYTE WalkString[16]="Walk";
  443.     static struct IntuiText WalkTxt=
  444.         {1,2,JAM2,15,1,NULL,NULL,NULL};
  445.     static struct Gadget WalkGadg = {NULL,95,67,61,12,
  446.         GADGHCOMP,TOGGLESELECT|RELVERIFY,
  447.         BOOLGADGET|REQGADGET,NULL,NULL,NULL,0L,NULL,6,NULL};
  448.  
  449.     /*REQUESTER*/
  450.     static UBYTE RequestString[48];
  451.     static struct IntuiText RequestTxt={1,2,JAM2,55,50,
  452.     NULL,RequestString,NULL};
  453.     static SHORT RequesterPairs[]={0,0,249,0,249,79,0,79,0,0};
  454.     static struct Border RequesterBorder={0,0,1,0,JAM1,5,NULL,NULL};
  455.  
  456.     struct Requester AnswerRequest;
  457.     struct IntuiMessage *message;
  458.  
  459.     register int classb;
  460.     int failure=0;
  461.     USHORT GadgetNum;
  462.     struct Gadget *TempPtr;
  463.  
  464.     BOOL Waiton=TRUE;
  465.     sprintf(RequestString,"%s %2d","Setup Channel",Number);
  466.     TempHigh=Event->HighPitch;
  467.     TempLow=Event->LowPitch;
  468.     TempWalking=Event->Walking;
  469.     TempChannel=Event->Channel;
  470.  
  471.     InitRequester(&AnswerRequest);
  472. /*NEW*/
  473.     if(Event->Walking) {
  474.         WalkGadg.Flags |= SELECTED;
  475.     }
  476.     else
  477.     {
  478.         WalkGadg.Flags &= ~(SELECTED);
  479.     }
  480.     OKGadget.NextGadget = NULL;
  481.     CancelGadget.NextGadget=&OKGadget;
  482.     HighGadg.NextGadget=&CancelGadget;
  483.     LowGadg.NextGadget=&HighGadg;
  484.     ChannelGadg.NextGadget=&LowGadg;
  485.     WalkGadg.NextGadget=&ChannelGadg;
  486. /*NEW STRINGS*/
  487.     OKTxt.IText=OKString;
  488.     CancelTxt.IText=CancelString;
  489.     HighTxt.IText=HighString;
  490.     LowTxt.IText=LowString;
  491.     ChannelTxt.IText=ChannelString;
  492.     WalkTxt.IText=WalkString;
  493. /*NEW PAIRS*/
  494.     OKBorder.XY=OKPairs;
  495.     HighBorder.XY=HighPairs;
  496. /*NEW Borders*/
  497.     OKGadget.GadgetRender     = (APTR)&OKBorder;
  498.     CancelGadget.GadgetRender = (APTR)&OKBorder;
  499.     HighGadg.GadgetRender     = (APTR)&HighBorder;
  500.     LowGadg.GadgetRender      = (APTR)&HighBorder;
  501.     WalkGadg.GadgetRender     = (APTR)&OKBorder;
  502. /*New txts*/
  503.     OKGadget.GadgetText=&OKTxt;
  504.     CancelGadget.GadgetText=&CancelTxt;
  505.     HighGadg.GadgetText=&HighTxt;
  506.     LowGadg.GadgetText=&LowTxt;
  507.     ChannelGadg.GadgetText=&ChannelTxt;
  508.     WalkGadg.GadgetText=&WalkTxt;
  509. /*NEW INFO*/
  510.     HighGadg.SpecialInfo=(APTR)&HighInfo;
  511.     LowGadg.SpecialInfo=(APTR)&LowInfo;
  512.     ChannelGadg.SpecialInfo=(APTR)&ChannelInfo;
  513. /*New BUFFS*/
  514.     HighInfo.Buffer=HighBuff;
  515.     LowInfo.Buffer=LowBuff;
  516.     ChannelInfo.Buffer=ChannelBuff;
  517.     
  518.     AnswerRequest.OlderRequest=NULL;
  519.     AnswerRequest.LeftEdge=4; /*position*/
  520.     AnswerRequest.TopEdge=3;
  521.     AnswerRequest.Width=250;
  522.     AnswerRequest.Height=80;
  523.     AnswerRequest.RelLeft=0;
  524.     AnswerRequest.RelTop=0;
  525.     AnswerRequest.ReqGadget=&WalkGadg;
  526.     AnswerRequest.ReqBorder=&RequesterBorder;
  527.     AnswerRequest.ReqText=&RequestTxt;
  528.     AnswerRequest.Flags=0;
  529.     AnswerRequest.BackFill=3;
  530.     AnswerRequest.ReqLayer=NULL;
  531.     AnswerRequest.ImageBMap=NULL;
  532.     AnswerRequest.RWindow = w;
  533.     RequesterBorder.XY=RequesterPairs;
  534.     sprintf(ChannelBuff,"%2d",Event->Channel);
  535.     MIDItoPitchName(Event->HighPitch,HighBuff);
  536.     MIDItoPitchName(Event->LowPitch,LowBuff);
  537.     
  538.     Request(&AnswerRequest,w);
  539.     OnGadget(&WalkGadg,w,&AnswerRequest);
  540.     RefreshGadgets(&WalkGadg,w,&AnswerRequest);
  541.     
  542.     while (Waiton) {
  543.         if(w->UserPort->mp_SigBit) {
  544.             message=(struct IntuiMessage *)GetMsg(w->UserPort);
  545.             if(message != NULL) {
  546.                 classb=message->Class;
  547.                 TempPtr=(struct Gadget *)message->IAddress;
  548.                 ReplyMsg((struct Message *)message);
  549.                 if(classb == GADGETUP) {
  550.                     GadgetNum=TempPtr->GadgetID;
  551.                     switch(GadgetNum) {
  552.                         case 1: /*OK*/
  553.                             failure=0;
  554.                             if(TempHigh > 0) {
  555.                         Event->HighPitch=TempHigh;
  556.                         }
  557.                             if(TempLow > 0) {
  558.                         Event->LowPitch =TempLow;
  559.                         }
  560.                         Event->Channel=TempChannel;
  561.                         Event->Walking=TempWalking;
  562.                             Waiton=FALSE;
  563.                             break;
  564.                         case 2: /*Cancel*/
  565.                             failure=1;
  566.                             Waiton=FALSE;
  567.                             break;
  568.                         case 3: /*HighPitch*/
  569.                             failure=0;
  570.                     TempHigh=PitchNametoMIDI(HighBuff);
  571.                             break;
  572.                         case 4: /*LowPitch*/
  573.                             failure=0;
  574.                     TempLow=PitchNametoMIDI(LowBuff);
  575.                             break;
  576.                         case 5: /*Channel*/
  577.                             failure=0;
  578.                     TempChannel=atoi(ChannelBuff);
  579.                             break;
  580.                         case 6: /*Walking*/
  581.                             failure=0;
  582.                             TempWalking = 
  583.                     ((WalkGadg.Flags & SELECTED) != 0);
  584.                             break;
  585.                     }
  586.                 }
  587.             }
  588.         }
  589.     }
  590.     EndRequest(&AnswerRequest,w);
  591.     return failure;
  592. }
  593.  
  594. char *MIDItoPitchName(int NoteNum, char *PitchName) 
  595. {
  596.     const char NoteNames[12][4]={"C","C#","D","D#","E","F","F#","G",
  597.         "G#","A","A#","B"};
  598.     sprintf(PitchName,"%s%1d",NoteNames[NoteNum % 12],(NoteNum/12)-1);
  599.     return PitchName;
  600. }
  601.  
  602. int PitchNametoMIDI(char *PitchName)
  603. {
  604.     char TempString[4]={0,0,0,0};
  605.     int PitchMIDI;
  606.     const int SmallScale[7]={9,11,0,2,4,5,7};
  607.  
  608.     if((toupper(PitchName[0]) > 64) && (toupper(PitchName[0])<72))
  609.     {
  610.         PitchMIDI = SmallScale[toupper(PitchName[0])-65];
  611.     }
  612.     else {    return 0; }
  613.     
  614.     if((strlen(PitchName) < 2) || (strlen(PitchName) >3)) return 0;
  615.  
  616.     if (strlen(PitchName) == 3)
  617.     {
  618.         switch (PitchName[1]) {
  619.             case 'b':
  620.             PitchMIDI = PitchMIDI-1;
  621.             break;
  622.             case 'B':
  623.             PitchMIDI = PitchMIDI-1;
  624.             break;
  625.             case '#':
  626.             PitchMIDI = PitchMIDI + 1;
  627.             break;
  628.         }
  629.     }
  630.     TempString[0]=PitchName[strlen(PitchName)-1];
  631.     PitchMIDI=PitchMIDI+(12*(atoi(TempString)+1));
  632.     return PitchMIDI;
  633. }
  634.